package auth_middleware

import (
	"fmt"
	"go_essential/common/response"
	"go_essential/database"
	"go_essential/tool"

	"github.com/gin-gonic/gin"
)

// 检查 Header 中是否带有合法的 token
// 如果没有，则拒绝访问
// 如果有，则刷新 redis 中 token 的过期时间
func AuthMiddleware(c *gin.Context) {
	fmt.Println("auth middleware, start")
	token := c.GetHeader("token")
	if token == "" {
		response.Fail(c, gin.H{}, "请求未携带token，无权限访问")
		// c.JSON(200, gin.H{
		// 	"code":    2001,
		// 	"message": "请求未携带token，无权限访问",
		// })
		c.Abort()
		return
	}
	username := tool.ParseToken(token)
	if username == "" {
		response.Fail(c, gin.H{}, "token 无效，无权限访问")
		// c.JSON(200, gin.H{
		// 	"code":    2002,
		// 	"message": "token 无效，无权限访问",
		// })
		c.Abort()
		return
	}
	// 获取 redis 的值，验证 token 是否正确
	tokenInRedis := database.GetKey(username)
	if tokenInRedis != token {
		// 验证不通过
		response.Fail(c, gin.H{}, "token 无效，无权限访问")
		// c.JSON(200, gin.H{
		// 	"code":    2003,
		// 	"message": "token 无效，无权限访问",
		// })
		c.Abort()
		return
	}
	// 验证通过，更新 redis
	if !database.SetKey(username, token, 60*60) {
		response.Fail(c, gin.H{}, "更新 token 失败")
		// c.JSON(200, gin.H{
		// 	"code":    2004,
		// 	"message": "更新 token 失败",
		// })
		c.Abort()
		return
	}
	c.Next()
	fmt.Println("auth middleware, end")
}
